﻿<h2>2.3. 程序员的层次 </h2>
<p>
内容授权：<a href="http://www.opensource.org/licenses/bsd-license.php" target=_blank>BSD 许可证</a><br/>
完成日期：2009-08-16</p>
<p>
作者：史荣久(trydofor)<br/>
邮箱：<a href="mailto:trydofor@gmail.com" target=_blank>trydofor@gmail.com</a><br/>
网址：<a href="http://www.trydofor.com/" target=_blank>www.trydofor.com</a></p>

<p>
对程序员层次的具体化，有利于职业规划和指导学习。
为统一称呼并清晰成长路线，本文对程序员层次划分如下，</p>
<ul>
<li>助理程序员</li>
<li>程序员</li>
<li>高级程序员</li>
<li>资深程序员</li></ul>

<h3>2.3.1. 适用语境</h3>
<p>
本组词汇是根据程序员工作角色，熟练程度，项目贡献进行划分，
主要用来描述程序员的工作性质，发展层次。
<b>不表示</b>能力大小，等级。
<b>不适应</b>于管理，流程，模型等语境下。</p>
<p>
因角色，性质或视角的不同，程序员有着多种称呼，非本文讨论范围。比如，</p>
<ul>
<li>分析师，设计师，架构师，系统工程师，网络工程师；</li>
<li>初级程序，中级程序，高级程序员；</li>
<li>程序员(PG)，软件工程师(SE)，高级软件工程师(SSE)；</li>
<li>录入员(Coder)，程序员(Programmer)，开发者(Developer)；</li></ul>

<h3>2.3.2. 划分理论</h3>
<p>
在软件开发实践中和程序员最直接相关的工作包括以下7类。</p>
<ol>
<li>分析(analysis):需求分析，问题调研等。</li>
<li>设计(design):形成解决方案，包括文档，图表，程序框架等。</li>
<li>实现(implementation):具体的编码活动。</li>
<li>调试(testing/debuging):各种阶段和类型的测试。</li>
<li>文档(documentation):形成说明书，手册等。</li>
<li>安装(installation):安装，部署及初始化软件。</li>
<li>维护(maintenance):软件的维护，运营，bug修正等，不含二次开发。</li></ol>
<p>
这些称为<b>"工作角色"</b>。通常开发中程序员身兼多种角色，这样有利于提高效率和技能水平。</p>
<p>
<b>"熟练程度"</b>，指对一个"工作角色"的把握程度。(参见"2.2.了解/熟悉/掌握/精通/大师")。
熟练程度通常从技术和业务两方面考虑。业务指程序所完成的功能及功能间联系。</p>
<p>
<b>"项目贡献"</b>，指一个"工作角色"中担负工作量与总工作量的比值。<br/>
一个"★"表示20%左右，最高"★★★★★"表示100%。
假设项目中有A，B两类个程序员，A贡献了2万行代码，B贡献了8万行，
那么A在"实现"上的贡献度为20%，就是"★"。</p>

<h3>2.3.3. 助理程序员</h3>
<table>
<tr>
<th>工作角色</th>
<th>熟练程度</th>
<th>项目贡献</th></tr>
<tr>
<td>分析</td>
<td>不知-了解</td>
<td>&nbsp;</td></tr>
<tr>
<td>设计</td>
<td>不知-了解</td>
<td>&nbsp;</td></tr>
<tr>
<td>实现</td>
<td>不知-熟练</td>
<td>★★★★</td></tr>
<tr>
<td>调试</td>
<td>不知-熟练</td>
<td>★★★★</td></tr>
<tr>
<td>文档</td>
<td>不知-了解</td>
<td>★★★</td></tr>
<tr>
<td>安装</td>
<td>不知-了解</td>
<td>&nbsp;</td></tr>
<tr>
<td>维护</td>
<td>不知-了解</td>
<td>&nbsp;</td></tr>
</table>
<p>
助理程序员通常具有以下一些特征，</p>
<ul>
<li>技术不熟练。</li>
<li>业务不熟练。</li>
<li>大量编写代码。</li>
<li>工作被动。</li>
<li>无创造性。</li></ul>

<h3>2.3.4. 程序员</h3>
<table>
<tr>
<th>工作角色</th>
<th>熟练程度</th>
<th>项目贡献</th></tr>
<tr>
<td>分析</td>
<td>了解-掌握</td>
<td>★</td></tr>
<tr>
<td>设计</td>
<td>了解-掌握</td>
<td>★</td></tr>
<tr>
<td>实现</td>
<td>熟悉-掌握</td>
<td>★★</td></tr>
<tr>
<td>调试</td>
<td>熟悉-掌握</td>
<td>★★</td></tr>
<tr>
<td>文档</td>
<td>了解-掌握</td>
<td>★★★</td></tr>
<tr>
<td>安装</td>
<td>了解-掌握</td>
<td>★</td></tr>
<tr>
<td>维护</td>
<td>了解-掌握</td>
<td>★</td></tr>
</table>
<p>
程序员通常具有以下一些特征，</p>
<ul>
<li>技术和业务熟练。</li>
<li>阅读和编写过大量代码。</li>
<li>热衷于技术研究和学习。</li>
<li>有个人观点和见解。</li>
<li>代码bug率低。</li>
<li>代码可读性好。</li></ul>

<h3>2.3.5. 高级程序员</h3>
<table>
<tr>
<th>工作角色</th>
<th>熟练程度</th>
<th>项目贡献</th></tr>
<tr>
<td>分析</td>
<td>掌握-精通</td>
<td>★★</td></tr>
<tr>
<td>设计</td>
<td>掌握-精通</td>
<td>★★</td></tr>
<tr>
<td>实现</td>
<td>精通-大师</td>
<td>★</td></tr>
<tr>
<td>调试</td>
<td>精通-大师</td>
<td>★</td></tr>
<tr>
<td>文档</td>
<td>掌握-精通</td>
<td>★★</td></tr>
<tr>
<td>安装</td>
<td>掌握-精通</td>
<td>★★</td></tr>
<tr>
<td>维护</td>
<td>掌握-精通</td>
<td>★★</td></tr>
</table>
<p>
高级程序员通常具有以下一些特征，</p>
<ul>
<li>精通技术和业务。</li>
<li>代码稳定易读。</li>
<li>具有创造性。</li>
<li>编写基础代码。</li></ul>

<h3>2.3.6. 资深程序员</h3>
<table>
<tr>
<th>工作角色</th>
<th>熟练程度</th>
<th>项目贡献</th></tr>
<tr>
<td>分析</td>
<td>精通-大师</td>
<td>★★★</td></tr>
<tr>
<td>设计</td>
<td>精通-大师</td>
<td>★★★</td></tr>
<tr>
<td>实现</td>
<td>精通-大师</td>
<td>★</td></tr>
<tr>
<td>调试</td>
<td>精通-大师</td>
<td>★</td></tr>
<tr>
<td>文档</td>
<td>精通-大师</td>
<td>★★</td></tr>
<tr>
<td>安装</td>
<td>精通-大师</td>
<td>★★</td></tr>
<tr>
<td>维护</td>
<td>精通-大师</td>
<td>★★</td></tr>
</table>
<p>
资深程序员通常具有以下一些特征，</p>
<ul>
<li>精通技术和业务。</li>
<li>视编程为艺术。</li>
<li>设计项目原型。</li>
<li>编写框架或核心代码。</li></ul>